package com.wyz.note.project.handler;

import com.wyz.note.project.result.ResultVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.Arrays;
import java.util.List;

import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8;
import static org.springframework.web.reactive.function.server.ServerResponse.ok;

/**
 * @Description: 测试处理器
 * @Author: wei yz
 * @Date: 2023/7/2 14:35
 */
@Slf4j
@Component
public class DemoHandler {

    public Mono<ServerResponse> list(ServerRequest request) {
        List<ResultVO> list = Arrays.asList(ResultVO.builder()
                .code("200")
                .data(String.format("天青色等烟雨，而我在等你呀"))
                .msg("success")
                .build());
        log.info("当前请求进入 /list  ~ ~");
        return ok().contentType(APPLICATION_JSON_UTF8)
                .body(Flux.fromIterable(list), ResultVO.class);
    }

    /**
     * 创建用户
     *
     * @param request
     * @return
     */
    public Mono<ServerResponse> inst(ServerRequest request) {
        // 2.0.0 是可以工作, 但是2.0.1 下面这个模式是会报异常
        Mono<ResultVO> user = request.bodyToMono(ResultVO.class);
        /**Mono 使用响应式的,时候都是一个流,是一个发布者,任何时候都不能调用发布者的订阅方法
         也就是不能消费它, 最终的消费还是交给我们的Springboot来对它进行消费,任何时候不能调用它的
         user.subscribe();
         不能调用block
         把异常放在统一的地方来处理
         */
        log.info("当前请求进入 /inst  ~ ~");
        return user.flatMap(dto ->
        {
            // 校验代码需要放在这里
            if (StringUtils.isBlank(dto.getCode())) {
                throw new RuntimeException("用户名不能为空");
            }
            return ok().contentType(APPLICATION_JSON_UTF8)
                    .body(Mono.create(cityMonoSink -> cityMonoSink.success(add(dto))), ResultVO.class);
        });
    }

    private ResultVO add(ResultVO resultVO) {
        return ResultVO.builder().msg("mmmm").data("datadddddd").code("8888").build();
    }

    /**
     * 根据id删除用户
     *
     * @param request
     * @return
     */
    public Mono<ServerResponse> del(ServerRequest request) {
        String id = request.pathVariable("id");
        // 校验代码需要放在这里
        if (StringUtils.isBlank(id)) {
            throw new RuntimeException("id不能为空");
        }
        log.info("当前请求进入 /del  ~ ~");
        ResultVO dto = new ResultVO();
        dto.setCode("9999999999");
        return ok().contentType(APPLICATION_JSON_UTF8)
                .body(Mono.create(cityMonoSink -> cityMonoSink.success(dto)), ResultVO.class);
    }
}
